﻿#ifndef __SATELLITE_MGR_H__
#define __SATELLITE_MGR_H__

#include"../DataBase/EvSatelliteData.hpp"
#include"../Base/Concurrency/SpinLock.hpp"
#include<unordered_map>
#include<string>
#include<vector>

namespace SC_SUN
{

class MapApp;

class SatelliteMGR
{
protected:

    ///环境服务对象
    MapApp& mApp;

    ///key值为SAT_SN，value为EvSatelliteData类型数据
    std::unordered_map<std::string, EvSatelliteData> mSatellites;

    ///卫星编号列表
    std::vector<std::string> mSatelliteSNs;

    ///互斥锁
    MMF::SpinLock mMutex;

    ///所有状态转移矩阵
    ///由于原始数据中的状态转移矩阵是将所有帧的都塞到一起的相当远是6 * 6 * n的数据，而实际需要的是6 * 6根据没一帧去取
    ///取数据的时候可能还涉及到轨道的步长，GNSS步长和星数据步长不一致的情况需要根据具体的步长信息算倍数
    std::unordered_map<std::string, std::vector<std::vector<std::vector<double>>>> mAllPrtDvaMat;

public:

    SatelliteMGR(MapApp& app):mApp(app) {}
    ~SatelliteMGR() {}

    ///加载卫星数据
    int LoadData();

    ///添加卫星数据
    bool AddSatellite(const std::string& SatSN, const EvSatelliteData& sat);

    ///查找卫星
    bool FindSatellite(const std::string& SatSN);

    ///获取卫星
    EvSatelliteData* GetSatellite(const std::string& SatSN, uint32_t sliceIdx);

    ///删除卫星
    bool DeleteSatellite(const std::string& SatSN);

    ///<设置卫星父节点
    bool AddParent(const std::string& SatSN, const std::string& ParentSatSN);
    bool DeleteParent(const std::string& SatSN, const std::string& ParentSatSN);

    ///<设置卫星子节点
    bool AddChild(const std::string& SatSN, const std::string& ChildSatSN);
    bool DeleteChild(const std::string& SatSN, const std::string& ChildSatSN);

    ///清除卫星连接关系
    bool ClearAllCollections();

    ///获取卫星编号列表
    const std::vector<std::string>& GetSatelliteList();

    //获取仿真时长
    void GetTimeAndStep(double& time, double& step);
};

}

#endif